import { RoleAttributeEnum, RoleAttributeModule } from "../../Role.type";
import { RoleNumericMap } from "./RoleNumericMap";

/**
 * 角色属性对象
 * 1、不同模块设置对应的属性值
 * 2、任意模块的属性值修改时，自动角色属性更新后的数值和
 */
export class RoleNumeric {
  /** 数值更新事件 */
  onUpdate: Function = null!;
  /** 属性类型 */
  type: RoleAttributeEnum = null!;
  /** 各模块附加值求和总数值 */
  value: number = 0;

  /** 属性值集合 */
  protected attributes: RoleNumericMap;
  /** 分组不同模块数值 */
  protected values: Map<RoleAttributeModule, number> = new Map();
  constructor(type: RoleAttributeEnum, attributes: RoleNumericMap) {
    this.type = type;
    this.attributes = attributes;

    // 设置初始值
    var rmt = RoleAttributeModule;
    for (var key in rmt) {
      var k = Number(key);
      if (k > -1) this.values.set(k, 0);
    }
  }

  /** 获取指定模块属性值 */
  protected getValue(module: RoleAttributeModule) {
    return this.values.get(module);
  }

  /** 设置指定模块属性值 */
  protected setValue(module: RoleAttributeModule, value: number) {
    this.values.set(module, value);
    this.update();
  }

  protected update() {
    var result = 0;
    this.values.forEach((value) => {
      result += value;
    });
    this.value = result;

    this.onUpdate && this.onUpdate(this);
  }

  reset() {
    this.values.clear();
    this.update();
  }

  /** 角色基础属性 */
  get base(): number {
    return this.getValue(RoleAttributeModule.Base)!;
  }
  set base(value: number) {
    this.setValue(RoleAttributeModule.Base, value);
  }

  /** 角色职业属性 */
  get job(): number {
    return this.getValue(RoleAttributeModule.Job)!;
  }
  set job(value: number) {
    this.setValue(RoleAttributeModule.Job, value);
  }

  /** 等级属性 */
  get level(): number {
    return this.getValue(RoleAttributeModule.Level)!;
  }
  set level(value: number) {
    this.setValue(RoleAttributeModule.Level, value);
  }

  /** 修饰器属性 */
  get decorator(): number {
    return this.getValue(RoleAttributeModule.Decorator)!;
  }
  set decorator(value: number) {
    this.setValue(RoleAttributeModule.Decorator, value);
  }
}
